#ifndef __SE_KEY_RECOMMENDER_HPP__
#define __SE_KEY_RECOMMENDER_HPP__

#include "Dictionary.hpp"

#include <queue>

namespace se {

// 候选词结构体
struct CandidateResult {
public:
    std::string _word;  // 推荐单词
    int32_t _frequency;  // 频率
    int32_t _distance;  // 与查询单词的最小编辑距离

public:
    /**
     * @brief Construct a new Candidate Result object
     * 
     * @param _word 单词
     * @param frequency 频率 
     * @param distance 与查询词的最小编辑距离
     */
    CandidateResult(const std::string &word, int32_t frequency, int32_t distance);

    CandidateResult() = default;

    /**
     * @brief 重载大于运算符
     * 
     * @param rhs 要比较的操作数
     * @return true 大于 rhs
     * @return false 不大于 rhs
     */
    bool operator>(const CandidateResult &rhs) const;
};

class KeyRecommender {
public:
    /**
     * @brief Construct a new Key Recommender object
     * 
     * @param inquiry 要查询的单词
     */
    explicit KeyRecommender(const std::string &inquiry);

    /**
     * @brief 获取查询结果
     * 
     * @return std::shared_ptr<nlohmann::json> 返回关联度最高的前n个单词
     */
    std::shared_ptr<nlohmann::json> queryResult();

private:
    /**
     * @brief 从字典中查询
     * 
     */
    void queryFromDictionary();
    
    /**
     * @brief 从缓存中查询
     */
    std::shared_ptr<nlohmann::json> queryFromCache(); 
private:
    std::priority_queue<CandidateResult, std::vector<CandidateResult>, std::greater<CandidateResult>> _candidate;  // 查询结果的所有候选词
    std::string _inquiry;  // 查询的单词
};

}  // namespace se

#endif
